import tkinter as tk
import tkinter.filedialog as fd
import subprocess

# 创建一个窗口
window = tk.Tk()
window.title("ffmpeg调用器")
window.geometry("400x300")

# 创建一个标签
label1 = tk.Label(window, text="请选择输入文件：")
label1.pack()

# 创建一个按钮，用于选择输入文件
button1 = tk.Button(window, text="浏览", command=lambda: select_input_file())
button1.pack()

# 创建一个变量，用于存储输入文件的路径
input_file = tk.StringVar()

# 定义一个函数，用于选择输入文件
def select_input_file():
    # 使用文件对话框选择文件
    file = fd.askopenfilename()
    # 如果选择了文件，更新变量的值
    if file:
        input_file.set(file)

# 创建一个标签
label2 = tk.Label(window, text="请选择输出文件的路径：")
label2.pack()

# 创建一个按钮，用于选择输出文件的路径
button2 = tk.Button(window, text="浏览", command=lambda: select_output_file())
button2.pack()

# 创建一个变量，用于存储输出文件的路径
output_file = tk.StringVar()

# 定义一个函数，用于选择输出文件的路径
def select_output_file():
    # 使用文件对话框选择文件
    file = fd.asksaveasfilename()
    # 如果选择了文件，更新变量的值
    if file:
        output_file.set(file)

# 创建一个标签
label3 = tk.Label(window, text="请选择输出文件的类型：")
label3.pack()

# 创建一个下拉列表，用于选择输出文件的类型
options1 = ["mp4", "wav", "mp3", "avi"]
type_var = tk.StringVar()
type_var.set(options1[0])
type_menu = tk.OptionMenu(window, type_var, *options1)
type_menu.pack()

# 创建一个标签
label4 = tk.Label(window, text="如果输出的是视频，请选择视频编码格式：")
label4.pack()

# 创建一个下拉列表，用于选择视频编码格式
options2 = ["HEVC", "H.264"]
codec_var = tk.StringVar()
codec_var.set(options2[0])
codec_menu = tk.OptionMenu(window, codec_var, *options2)
codec_menu.pack()

# 创建一个标签
label5 = tk.Label(window, text="如果输出的是视频，请选择视频分辨率：")
label5.pack()

# 创建一个下拉列表，用于选择视频分辨率
options3 = ["1920x1080", "1280x720", "640x480"]
resolution_var = tk.StringVar()
resolution_var.set(options3[0])
resolution_menu = tk.OptionMenu(window, resolution_var, *options3)
resolution_menu.pack()

# 创建一个按钮，用于运行ffmpeg命令
button3 = tk.Button(window, text="运行", command=lambda: run_ffmpeg())
button3.pack()

# 定义一个函数，用于运行ffmpeg命令
def run_ffmpeg():
    # 获取输入和输出文件的路径
    input_path = input_file.get()
    output_path = output_file.get()
    # 如果没有选择输入或输出文件，显示警告信息
    if not input_path or not output_path:
        tk.messagebox.showwarning("警告", "请选择输入和输出文件！")
        return

    # 获取输出文件的类型、视频编码格式和视频分辨率
    output_type = type_var.get()
    output_codec = codec_var.get()
    output_resolution = resolution_var.get()
    # 根据不同的类型、编码格式和分辨率，生成不同的ffmpeg命令
    if output_type == "mp4":
        if output_codec == "HEVC":
            command = f"ffmpeg -i {input_path} -c:v libx265 -s {output_resolution} {output_path}.mp4"
        else:
            command = f"ffmpeg -i {input_path} -c:v libx264 -s {output_resolution} {output_path}.mp4"
    elif output_type == "wav":
        command = f"ffmpeg -i {input_path} {output_path}.wav"
    elif output_type == "mp3":
        command = f"ffmpeg -i {input_path} {output_path}.mp3"
    elif output_type == "avi":
        if output_codec == "HEVC":
            command = f"ffmpeg -i {input_path} -c:v libx265 -s {output_resolution} {output_path}.avi"
        else:
            command = f"ffmpeg -i {input_path} -c:v libx264 -s {output_resolution} {output_path}.avi"

    try:
        # 使用subprocess模块执行命令
        subprocess.run(command.split(), check=True)
        # 显示成功信息
        tk.messagebox.showinfo("成功", "ffmpeg命令执行成功！")
    except Exception as e:
        # 显示错误信息
        tk.messagebox.showerror("错误", f"ffmpeg命令执行失败：{e}")

# 启动窗口循环
window.mainloop()
